package encheres.manager;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import javax.xml.ws.Endpoint;

import org.omg.CORBA.*;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;

import encheres.manager.corba.I_Categorie;
import encheres.manager.corba.I_CategorieHelper;
import encheres.manager.corba.I_Client;
import encheres.manager.corba.I_ClientHelper;
import encheres.manager.corba.I_Produit;
import encheres.manager.corba.I_ProduitHelper;
import encheres.manager.impl.I_CategorieImpl;
import encheres.manager.impl.I_ClientImpl;
import encheres.manager.impl.I_ProduitImpl;
import encheres.manager.ws.ServiceEnchereImpl;

/**
 * Serveur CORBA du projet Encheres.
 * @author Nicolas
 *
 */
public class ServeurEncheres {
	
	/**
	 * Lance le serveur CORBA d'après les caractéristiques du fichier proprietesCorbaIUP.properties
	 * @param args
	 * 
	 * void
	 */
	public static void main(String args[]) {
		try {
			Endpoint endpoint = Endpoint.publish("http://localhost:8080/ws/ServiceEnchere", new ServiceEnchereImpl());
			System.out.println("Serveur de web services lancé ? "+endpoint.isPublished());
		} catch (SecurityException  e) { 
			System.out.println("Serveur de web services arrêté.");
			e.printStackTrace();
			System.exit(0);
		}
		
		ORB orb = null;
		POA rootpoa = null;
		try {
			// Chargement du fichier de propriétés pour le serveur CORBA
			Properties defaultProps = new Properties();
			FileInputStream in = new FileInputStream("src/encheres/manager/proprietesCorbaIUP.properties");
			defaultProps.load(in);
			in.close();
			// Initialisation de l'objet ORB avec les propriété du projet Enchere
			orb = ORB.init(args, defaultProps);
			rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
			rootpoa.the_POAManager().activate();
		} catch (InvalidName e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		} catch (AdapterInactive e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		}

		// Enegistre dans l'ORB les implémentations pour les catégories, les clients et les produits.
		I_CategorieImpl categorieImpl = new I_CategorieImpl();
		categorieImpl.setORB(orb);
		I_ProduitImpl produitImpl = new I_ProduitImpl();
		produitImpl.setORB(orb);
		I_ClientImpl clientImpl = new I_ClientImpl();
		clientImpl.setORB(orb);

		try {
			org.omg.CORBA.Object refClient = rootpoa.servant_to_reference(clientImpl);
			org.omg.CORBA.Object refCategorie = rootpoa.servant_to_reference(categorieImpl);
			org.omg.CORBA.Object refProduit = rootpoa.servant_to_reference(produitImpl);
			
			I_Client hrefClient = I_ClientHelper.narrow(refClient);
			I_Categorie hrefCategorie = I_CategorieHelper.narrow(refCategorie);
			I_Produit hrefProduit = I_ProduitHelper.narrow(refProduit);
			
			org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
			NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
			
			NameComponent pathClient[] = ncRef.to_name("EncheresClient");
			NameComponent pathCategorie[] = ncRef.to_name("EncheresCategorie");
			NameComponent pathProduit[] = ncRef.to_name("EncheresProduit");
			
			ncRef.rebind(pathClient, hrefClient);
			ncRef.rebind(pathCategorie, hrefCategorie);
			ncRef.rebind(pathProduit, hrefProduit);
		} catch (NotFound e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		} catch (CannotProceed e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		} catch (ServantNotActive e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		} catch (WrongPolicy e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		} catch (InvalidName e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
			e.printStackTrace();
			System.out.println("Serveur d'enchères arrêté.");
			System.exit(0);
		}
		System.out.println("Serveur d'enchères lancé...");
		orb.run();
		
	}
}
